
# 使用闭包，就是内层函数引用了外层函数的局部变量。
# 如果只是读外层变量的值，我们会发现返回的闭包函数调用一切正常：

# 父对象的所有变量，对子对象都是可见的，反之则不成立。
# def f1():
#     n=999
#     def f2():
#         print(n)

# def f1():
#     n = 999
#     def f2():
#         print(n)                    # f2可以不返回
#         # return 1
#     return f2                       # 返回了f2，就是一个闭包
#
# print(f1()())


# def inc():
#     x = 0
#     def fn():
#         # 仅读取x的值:
#         return x + 1
#     return fn
#
# f = inc()
# print(f()) # 1


# 但是，如果对外层变量赋值，由于Python解释器会把x当作函数fn()的局部变量，它会报错：
def inc():
    x = 0
    def fn():
        # nonlocal x                    # 加上nonlocal，解释器把fn()的x看作外层函数的局部变量
        x = x + 1
        return x
    return fn

f = inc()
print(f()) # 1
print(f()) # 2